home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 11: TSX-11 / Linux Cubed Series 11 - TSX-11 Vol 1.iso / sbin / kbdrate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-30  |  3.8 KB  |  126 lines

  1. /*
  2. From: faith@cs.unc.edu (Rik Faith)
  3. Subject: User mode keyboard rate changer
  4. Date: 27 Apr 92 13:44:26 GMT
  5.  
  6. I put together this program, called kbdrate.c, which will reset the keyboard
  7. repeat rate and delay in user mode.  The program must have read/write
  8. access to /dev/port, so if /dev/port is only read/writeable by group port,
  9. then kbdrate must run setgid to group port (for example).
  10.  
  11. The "rate" is the rate in characters per second
  12.  
  13. The "delay" is the amount of time the key must remain depressed before it
  14. will start to repeat.
  15.  
  16. Usage examples:
  17.  
  18. kbdrate                 set rate to IBM default (10.9 cps, 250mS delay)
  19. kbdrate -r 30.0         set rate to 30 cps and delay to 250mS
  20. kbdrate -r 20.0 -s      set rate to 20 cps (delay 250mS) -- don't print message
  21. kbdrate -r 0 -d 0       set rate to 2.0 cps and delay to 250 mS
  22.  
  23. I find it useful to put kbdrate in my /etc/rc file so that the keyboard
  24. rate is set to something that I find comfortable at boot time.  This sure
  25. beats rebuilding the kernel!
  26. */
  27.  
  28. /********************** CUT HERE *****************************/
  29. /* kbdrate.c -- Set keyboard typematic rate (and delay)
  30.  * Created: Thu Apr 23 12:24:30 1992
  31.  * Revised: Mon Apr 27 09:38:45 1992 by faith
  32.  * Author: Rickard E. Faith, faith@cs.unc.edu
  33.  * Copyright 1992 Rickard E. Faith.  Distributed under the GPL.
  34.  * This program comes with ABSOLUTELY NO WARRANTY.
  35.  * Usage: kbdrate [-r rate] [-d delay] [-s]
  36.  *        Rate can range from 2.0 to 30.0 (units are characters per second)
  37.  *        Delay can range from 250 to 1000 (units are milliseconds)
  38.  *        -s suppressed message
  39.  * Compiles under gcc 2.1 for Linux (tested with the pre-0.96 kernel)
  40.  */
  41.  
  42. #include <stdio.h>
  43. #include <stdlib.h>
  44. #include <sys/file.h>
  45.  
  46. static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
  47.                                    133, 120, 109, 100, 92, 80, 80, 75, 67,
  48.                                    60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
  49.                                    25, 23, 21, 20 };
  50. #define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
  51.  
  52. static int valid_delays[] = { 250, 500, 750, 1000 };
  53. #define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
  54.  
  55. void main( int argc, char **argv )
  56. {
  57.    double      rate = 10.9;     /* Default rate */
  58.    int         delay = 250;     /* Default delay */
  59.    int         value = 0x7f;    /* Maximum delay with slowest rate */
  60.                                 /* DO NOT CHANGE this value */
  61.    int         silent = 0;
  62.    int         fd;
  63.    char        data;
  64.    int         c;
  65.    int         i;
  66.    extern char *optarg;
  67.    extern int  optind;
  68.  
  69.    while ( (c = getopt( argc, argv, "r:d:s" )) != EOF )
  70.          switch (c) {
  71.          case 'r':
  72.             rate = atof( optarg );
  73.             break;
  74.          case 'd':
  75.             delay = atoi( optarg );
  76.             break;
  77.          case 's':
  78.             silent = 1;
  79.             break;
  80.          }
  81.  
  82.    for (i = 0; i < RATE_COUNT; i++)
  83.          if (rate * 10 >= valid_rates[i]) {
  84.             value &= 0x60;
  85.             value |= i;
  86.             break;
  87.          }
  88.  
  89.    for (i = 0; i < DELAY_COUNT; i++)
  90.          if (delay <= valid_delays[i]) {
  91.             value &= 0x1f;
  92.             value |= i << 5;
  93.             break;
  94.          }
  95.  
  96.    if ( (fd = open( "/dev/port", O_RDWR )) < 0) {
  97.       perror( "Cannot open /dev/port" );
  98.       exit( 1 );
  99.    }
  100.  
  101.    do {
  102.       lseek( fd, 0x64, 0 );
  103.       read( fd, &data, 1 );
  104.    } while ((data & 2) == 2 );  /* wait */
  105.  
  106.    lseek( fd, 0x60, 0 );
  107.    data = 0xf3;                 /* set typematic rate */
  108.    write( fd, &data, 1 );
  109.  
  110.    do {
  111.       lseek( fd, 0x64, 0 );
  112.       read( fd, &data, 1 );
  113.    } while ((data & 2) == 2 );  /* wait */
  114.  
  115.    lseek( fd, 0x60, 0 );
  116.    write( fd, &value, 1 );
  117.  
  118.    close( fd );
  119.  
  120.    if (!silent) printf( "Typematic Rate set to %.1f cps (delay = %d mS)\n",
  121.                        valid_rates[value & 0x1f] / 10.0,
  122.                        valid_delays[ (value & 0x60) >> 5 ] );
  123. }
  124.  
  125.  
  126.